<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
  let p =new Promise((resolve,reject) => {
    setTimeout(() => {
      // resolve('成功')
      reject('失败')
    },2000)
  })
  // p.then(res = {
  //   resolve(res)
  // })
  // p.catch(err => {
  //   reject(err)
  // })
  // 高级语法1
  // 口诀: Promise 对象 .then() 在原地会有一个返回值 是一个"全新的Promise对象"
  // 高级语法2
  // 口诀: Promise 对象.catch() 在原地会有一个返回值 是一个全新的"全新的Promise对象"
  // 链式调用: 每个函数里返回同样一个对象,继续点调用内部其他方法,一直点下去就是链式调用
  // 高级用法3
  // 口诀: then() 里函数体里return 返回给下一个Promise 对象使用
  // 情况1: return 的是非 Promise对象
  // let pB = p.then(res => { // res: '成功'
  //   return 1000 // 特殊: return给pB(下一个 Promise 对象的then里使用)
  // })
  // pB.then(result => {
  //   console.log(result);
  // })
  // 情况2: return 的是一个新的Promise对象, 会替换掉then()函数默认在原地返回的那个"全新的Promise对象"
  // 下一个 then 拿到的是 return 的这个 Promise 对象里 resolve 的结果
  // 高级语法4 
  // catch() 里 return 回返回到下一个 Promise

  // awaitTo技术
  // 因为在await 只能默认取代 then 函数 只能拿到 then 结果
  // 如果 await 后面 Promise 内报错 我们需要使用 try+catch 来进行捕获
  // 想把 try+catch 优化掉 让 await 来提取到成功和失败的结果

  function myAxios() {
    let pA = new Promise((resolve,reject) => {
      setTimeout(() => {
        reject('失败')
      },2000)
    })
    return pA
  }
  let pA = myAxios()
  let pB = pA.then(res => {
    return [null,res]
  }).catch(err => {
    return [err,null] // 会返回给pB的 then 使用(pA的错误信息中转下去)
  })
  async function myFn() {
    const [err,res] = await pB // await 还是取代 pB 的 then
    if (err) console.error(err)
    else console.log(res)
  }
  myFn()

  </script>
</body>
</html>